{"version":3,"file":"static/chunks/pages/offers/[...slug]-a7501ee77d4128de.js","mappings":"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","sources":["webpack://_N_E/?576f","webpack://_N_E/./components/view-details.tsx","webpack://_N_E/./pages/offers/[...slug].tsx","webpack://_N_E/./utils/remove-qs.ts","webpack://_N_E/./utils/slugify-offer.ts"],"sourcesContent":["\n (window.__NEXT_P = window.__NEXT_P || []).push([\n \"/offers/[...slug]\",\n function () {\n return require(\"private-next-pages/offers/[...slug].tsx\");\n }\n ]);\n if(module.hot) {\n module.hot.dispose(function () {\n window.__NEXT_P.push([\"/offers/[...slug]\"])\n });\n }\n ","import { slugifyOfferName } from '../utils/slugify-offer';\nimport { BrandLink } from '@dx-ui/osc-brand-buttons';\nimport { useTranslation } from 'next-i18next';\nimport { addCampaignId, type OfferListingFragment } from '@dx-ui/content-offers-components';\n\ntype Offer = OfferListingFragment['offers'][0];\n\nexport function ViewDetailsLink({\n offer,\n hrefPrefix,\n onClick,\n}: {\n offer: Offer;\n hrefPrefix: string;\n onClick?: (offer: Offer) => void;\n}) {\n const { t } = useTranslation('offers');\n return (\n <BrandLink\n url={addCampaignId(`${hrefPrefix}${slugifyOfferName(offer)}`)}\n onClick={() => onClick?.(offer)}\n className=\"w-full text-center md:w-auto\"\n data-offer-slug={slugifyOfferName(offer)}\n data-offer-name={offer.name}\n aria-label={t('viewDetailsA11y', {\n offerName: offer?.name || '',\n })}\n target=\"_blank\"\n showNewWindowIcon={false}\n variant=\"solid\"\n label={t('viewDetails')}\n />\n );\n}\n","import {\n DX_AUTH_UI,\n OHW_BASE_URL_TRIMMED,\n queryClientProps,\n ASSETS_URI,\n AUTOCOMPLETE_URL,\n} from '../../utils/env-vars';\nimport { getServerSideClients, getServerSideSafeLanguage } from '@dx-ui/framework-react-query';\nimport type {\n StaticOfferQuery,\n BrandOfferListingQuery as BrandStaticOfferOptionsQuery,\n} from '@dx-ui/content-offers-components';\nimport {\n OfferDetails,\n OfferListing,\n serverSideBrandOfferListingQuery,\n serverSideStaticOfferQuery,\n} from '@dx-ui/content-offers-components';\n\nimport Head from 'next/head';\nimport { getOfferIdFromSlug, slugifyOfferName } from '../../utils/slugify-offer';\nimport { OffersHeader } from '../../components/header';\nimport { OffersFooter } from '../../components/footer';\nimport { useRouter } from 'next/router';\nimport { ViewDetailsLink } from '../../components/view-details';\nimport type { PageMetricsDetail, PageMetricsListing } from '../../components/analytics';\nimport { Analytics } from '../../components/analytics';\nimport { getBrandCanonical } from '../../utils/get-brand-canonical';\nimport { removeQs } from '../../utils/remove-qs';\nimport { serverSideNavigationQuery } from '../../generated/react-query';\nimport type { GetServerSideProps } from 'next';\nimport { getServerSideShopFormData } from '@dx-ui/osc-shop-form';\n\nimport { serverSideProps } from '../../utils/serverSideProps';\nimport { logWarning } from '@dx-ui/framework-logger';\n\nexport default function OfferSlugPage(props: {\n brandCode?: string;\n brandName?: string;\n brandUrl?: string;\n isBrandPage?: boolean;\n isBrandRefresh?: boolean;\n offerId?: number;\n seo?:\n | NonNullable<NonNullable<BrandStaticOfferOptionsQuery['brand']>['page']>['seo']\n | NonNullable<NonNullable<StaticOfferQuery['staticOffer']>['seo']>;\n metrics: PageMetricsListing | PageMetricsDetail;\n brandSlug?: string;\n}) {\n const { locale = 'en', query, asPath } = useRouter();\n const brandCode = props.brandCode || 'HI';\n const { seo, brandUrl, brandName, metrics } = props;\n const themeClassName = brandCode\n ? `theme-${brandCode.toLowerCase()}${props.isBrandRefresh ? '-refresh' : ''}`\n : undefined;\n\n return (\n <div className={themeClassName}>\n <Analytics metrics={metrics} />\n <Head>\n <title>{seo?.pageTitle}</title>\n <meta name=\"keywords\" content={seo?.metaKeywords || ''} />\n <meta name=\"description\" content={seo?.metaDescription || ''} />\n {seo?.hideSearchEngine ? <meta name=\"robots\" content=\"noindex,follow\" /> : null}\n </Head>\n <OffersHeader\n brandCode={brandCode}\n brandUrl={brandUrl}\n brandName={brandName}\n language={locale}\n />\n {props.offerId && (\n <OfferDetails\n offerId={props.offerId}\n language={locale}\n brandCode={brandCode}\n autocompleteUri={AUTOCOMPLETE_URL}\n baseUrl={OHW_BASE_URL_TRIMMED}\n signInIframeUrl={DX_AUTH_UI.replace('__LANG__', locale)}\n renderAdditionalComponents={(data) => {\n const path =\n data?.staticOffer?.type === 'brand'\n ? `/${locale}/offers/${slugifyOfferName(data?.staticOffer)}/`\n : asPath;\n const canonicalUrl = removeQs(path);\n\n return (\n <Head>\n <link rel=\"canonical\" href={canonicalUrl} />\n <meta name=\"twitter:card\" content=\"summary\" />\n <meta name=\"twitter:site\" content=\"@Hilton\" />\n <meta property=\"og:url\" content={canonicalUrl} />\n <meta property=\"og:type\" content=\"website\" />\n <meta property=\"og:title\" content={seo?.pageTitle || ''} />\n <meta property=\"og:description\" content={seo?.metaDescription || ''} />\n <meta property=\"og:site_name\" content=\"Hilton\" />\n <meta property=\"og:image\" content={data.firstImageForOg} />\n </Head>\n );\n }}\n />\n )}\n {props.isBrandPage && (\n <div className=\"container mx-auto my-4\">\n <Head>\n <link rel=\"canonical\" href={removeQs(`/${locale}${asPath}`)} />\n </Head>\n <OfferListing\n language={locale}\n brandCode={brandCode}\n assetUrl={ASSETS_URI}\n renderAdditionalComponents={(data) => {\n return (\n <Head>\n <meta name=\"twitter:card\" content=\"summary\" />\n <meta name=\"twitter:site\" content=\"@Hilton\" />\n <meta property=\"og:url\" content={removeQs(`/${locale}${asPath}`)} />\n <meta property=\"og:type\" content=\"website\" />\n <meta property=\"og:title\" content={seo?.pageTitle || ''} />\n <meta property=\"og:description\" content={seo?.metaDescription || ''} />\n <meta property=\"og:site_name\" content=\"Hilton\" />\n <meta property=\"og:image\" content={data.firstImageForOg} />\n </Head>\n );\n }}\n renderInternalOfferLink={(offer) => (\n <ViewDetailsLink\n offer={offer}\n hrefPrefix={`/${locale}/offers/${(query.slug as string[])?.join('/')}/`}\n />\n )}\n />\n </div>\n )}\n <OffersFooter brandCode={brandCode} language={locale} />\n </div>\n );\n}\n\nexport const getServerSideProps = async function getServerSideProps(context) {\n const { query, res, req } = context;\n const [possibleBrandName, possibleOfferId] = query.slug as [string, string];\n const featureToggleHeader = req.headers['dx-toggles'] as string;\n const locale = getServerSideSafeLanguage(context);\n\n const { queryClient } = getServerSideClients({\n ...queryClientProps,\n response: res,\n appName: 'dx-offers-ui',\n customHeaders: {\n 'dx-toggles': featureToggleHeader,\n },\n });\n const brandMatches = await getBrandCanonical({\n queryClient,\n requestedBrandName: possibleBrandName,\n language: locale,\n });\n\n if (brandMatches?.redirectBrandSlug) {\n const offerId = possibleOfferId;\n return {\n redirect: {\n destination: `/${locale}/offers/${brandMatches.redirectBrandSlug}/${\n offerId ? `${offerId}/` : ''\n }`,\n permanent: true,\n },\n };\n }\n\n if (brandMatches && !possibleOfferId) {\n // this is a brand listing page, not an offer detail page\n const brandOfferListingResult = await serverSideBrandOfferListingQuery(queryClient, {\n brandCode: brandMatches.brandCode,\n language: locale,\n }).catch((error) => {\n logWarning('FETCH_ERROR', error as Error, 'serverSideBrandOfferListingQuery');\n return null;\n });\n const brandCode = brandMatches.brandCode;\n const seo = brandOfferListingResult?.brand?.page?.seo || {};\n const metrics: PageMetricsListing = {\n brandCode: brandMatches.brandCode,\n brandName: brandOfferListingResult?.brand?.formalName || '',\n language: locale,\n primaryCategory: 'Brand',\n trackCallName: 'offerListingPageView',\n };\n\n if (locale !== 'en') {\n return {\n notFound: true,\n };\n }\n\n return serverSideProps({\n context,\n namespaces: ['osc-pagination'],\n queryClient,\n pageProps: {\n seo,\n metrics,\n isBrandPage: true,\n brandCode,\n brandUrl: brandMatches?.url || null,\n brandName: brandMatches?.formalName || null,\n },\n getServerSideQueries: ({ queryClient, language }) => [\n getServerSideShopFormData(queryClient, { getTranslateAutocomplete: true }).catch((e) => {\n logWarning('FETCH_ERROR', e as Error, 'serverSideShopFormData');\n }),\n serverSideNavigationQuery(queryClient, {\n language,\n brandCode: brandMatches?.brandCode || 'WW',\n }).catch((e) => {\n logWarning('FETCH_ERROR', e as Error, 'serverSideNavigationQuery');\n }),\n ],\n });\n }\n\n // brandName might be the offerId\n const unSlugifiedOfferId = possibleOfferId\n ? getOfferIdFromSlug(possibleOfferId || '')\n : getOfferIdFromSlug(possibleBrandName);\n\n // try to fetch that offer\n let offerResult: StaticOfferQuery | null = null;\n const offerId = isNaN(Number(unSlugifiedOfferId)) ? null : Number(unSlugifiedOfferId);\n if (offerId) {\n offerResult = await serverSideStaticOfferQuery(queryClient, {\n language: locale,\n offerId,\n includeHotel: false,\n ctyhocn: '',\n brandCode: brandMatches?.brandCode || 'WW',\n }).catch(() => null);\n }\n\n const brandOfferDetailPage = Boolean(possibleOfferId && possibleBrandName);\n\n // if that offer is not found redirect back to offers page or brand offers\n if (!offerResult?.staticOffer) {\n const urlParts = [locale, 'offers'];\n if (brandOfferDetailPage) {\n urlParts.push(brandMatches?.redirectBrandSlug || possibleBrandName);\n }\n return {\n redirect: {\n destination: `/${urlParts.join('/')}/`,\n permanent: true,\n },\n };\n }\n\n // make sure offer name slugified matches what was passed, if not redirect to correct name\n if (\n slugifyOfferName(offerResult.staticOffer) !==\n (brandOfferDetailPage ? possibleOfferId : possibleBrandName)\n ) {\n const urlParts = [locale, 'offers'];\n if (brandOfferDetailPage) {\n urlParts.push(brandMatches?.redirectBrandSlug || possibleBrandName);\n }\n urlParts.push(slugifyOfferName(offerResult.staticOffer));\n return {\n redirect: {\n destination: `/${urlParts.join('/')}/`,\n permanent: true,\n },\n };\n }\n\n const seo = offerResult?.staticOffer?.seo || {};\n const metrics: PageMetricsDetail = {\n brandCode: 'HI',\n brandName: offerResult?.brand?.formalName || '',\n language: locale,\n primaryCategory: 'Portfolio',\n trackCallName: 'offerDetailPageView',\n offerId: unSlugifiedOfferId,\n offerName: offerResult?.staticOffer?.name,\n };\n\n const brandCode = brandMatches?.brandCode || 'WW';\n\n if (brandCode !== 'WW' && locale !== 'en') {\n return {\n notFound: true,\n };\n }\n\n // otherwise offer found, this is a single offer page\n return serverSideProps({\n context,\n namespaces: [\n 'osc-accordion',\n 'osc-date-picker',\n 'osc-form',\n 'osc-location',\n 'osc-pagination',\n 'osc-shop-form',\n ],\n queryClient,\n pageProps: {\n seo,\n metrics,\n offerId,\n brandCode,\n brandUrl: brandMatches?.url || null,\n brandName: brandMatches?.formalName || null,\n },\n });\n} satisfies GetServerSideProps;\n","import { OHW_BASE_URL_TRIMMED } from './env-vars';\n\nexport function removeQs(asPath: string) {\n const url = new URL(`${OHW_BASE_URL_TRIMMED}${asPath}`);\n return `${url.protocol}//${url.host}${url.pathname}`;\n}\n","export { slugifyOfferName } from '@dx-ui/content-offers-components';\n\nexport function getOfferIdFromSlug(slug: string): string {\n const parts = slug.split('-');\n return parts[parts.length - 1] || '';\n}\n"],"names":["ViewDetailsLink","offer","hrefPrefix","onClick","useTranslation","t","BrandLink","url","addCampaignId","slugifyOfferName","className","data-offer-slug","data-offer-name","name","aria-label","offerName","target","showNewWindowIcon","variant","label","OfferSlugPage","props","useRouter","locale","query","asPath","brandCode","seo","brandUrl","brandName","metrics","themeClassName","toLowerCase","isBrandRefresh","undefined","div","Analytics","Head","title","pageTitle","meta","content","metaKeywords","metaDescription","hideSearchEngine","OffersHeader","language","offerId","OfferDetails","autocompleteUri","AUTOCOMPLETE_URL","baseUrl","OHW_BASE_URL_TRIMMED","signInIframeUrl","DX_AUTH_UI","replace","renderAdditionalComponents","data","path","staticOffer","type","canonicalUrl","removeQs","link","rel","href","property","firstImageForOg","isBrandPage","OfferListing","assetUrl","ASSETS_URI","renderInternalOfferLink","slug","join","OffersFooter","URL","protocol","host","pathname"],"sourceRoot":"","ignoreList":[]}